package com.xf.day07_graphx
/**
 * 注意:
 *    自定义 命名参数的函数
 */
// 定义一个简单的“人”的样例类，包含姓名和年龄
case class Person(name: String, age: Int)

// 定义一个“过滤器”对象，里面有一个类似 subgraph 的方法
object NamedParameters {

  /**
   * 一个模拟的过滤方法，类似于 Graph.subgraph。
   *
   * @param people 要过滤的人员列表
   * @param namePred 名称过滤函数，默认保留所有
   * @param agePred  年龄过滤函数，默认保留所有
   * @return 过滤后的新列表
   */
  def filterPeople(
                    people: List[Person],
                    namePred: String => Boolean = (name => true), // 默认：所有名字都通过
                    agePred: Int => Boolean = (age => true)       // 默认：所有年龄都通过
                  ): List[Person] = {
    // 使用 filter 方法，结合两个预测函数进行过滤
    people.filter(person => namePred(person.name) && agePred(person.age))
  }

  def main(args: Array[String]): Unit = {

    // ================== 使用示例 ==================

    // 创建一些测试数据
    val peopleList = List(
      Person("Alice", 25),
      Person("Bob", 18),
      Person("Charlie", 30),
      Person("Diana", 16)
    )

    // 情况1：只按年龄过滤，使用命名参数。这正是我们想要的简单例子！
    val youngPeople = NamedParameters.filterPeople(
      people = peopleList,
      agePred = (age) => age < 20  // 保留年龄小于20的人
    )
    println(s"年龄小于20的人: $youngPeople") // 输出: List(Person(Bob,18), Person(Diana,16))
    println("==============================================>")

    // 情况2：只按名字过滤
    val aPeople = NamedParameters.filterPeople(
      people = peopleList,
      namePred = (name) => name.startsWith("A") // 保留名字以'A'开头的人
    )
    println(s"名字以A开头的人: $aPeople") // 输出: List(Person(Alice,25))
    println("==============================================>")

    // 情况3：同时按名字和年龄过滤
    val youngAPeople = NamedParameters.filterPeople(
      people = peopleList,
      namePred = (name) => name.startsWith("A"),
      agePred = (age) => age < 20
    )
    println(s"年轻且名字以A开头的人: $youngAPeople") // 输出: List()


  }
}

